From 21660168d3d343b0ddd7b111491782b76d05f02a Mon Sep 17 00:00:00 2001 From: "mwilli2@equilibrium.research" Date: Wed, 16 Feb 2005 02:18:52 +0000 Subject: [PATCH] bitkeeper revision 1.1208 (4212ad8c5vLMbRL8isvvSTbC88iL5Q) usbfront: eliminate the urb_remove_list Signed-off-by: mark.williamson@cl.cam.ac.uk --- .../drivers/xen/usbfront/usbfront.c | 28 ++++++++----------- .../drivers/xen/usbfront/xhci.h | 4 --- 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/linux-2.6.10-xen-sparse/drivers/xen/usbfront/usbfront.c b/linux-2.6.10-xen-sparse/drivers/xen/usbfront/usbfront.c index 273fe75bec..264c3e6b07 100644 --- a/linux-2.6.10-xen-sparse/drivers/xen/usbfront/usbfront.c +++ b/linux-2.6.10-xen-sparse/drivers/xen/usbfront/usbfront.c @@ -380,8 +380,6 @@ static void receive_usb_io(usbif_response_t *resp) struct urb *urb = urbp->urb; urb->actual_length = resp->length; - urb->status = resp->status; - urbp->status = resp->status; urbp->in_progress = 0; if( usb_pipetype(urb->pipe) == 0 ) /* ISO */ @@ -398,6 +396,12 @@ static void receive_usb_io(usbif_response_t *resp) } free_page((unsigned long)urbp->schedule); } + + /* Only set status if it's not been changed since submission. It might + * have been changed if the URB has been unlinked asynchronously, for + * instance. */ + if ( urb->status == -EINPROGRESS ) + urbp->status = urb->status = resp->status; } /** @@ -567,7 +571,7 @@ static void xhci_destroy_urb_priv(struct urb *urb) return; if (!list_empty(&urb->urb_list)) - warn("xhci_destroy_urb_priv: urb %p still on xhci->urb_list or xhci->remove_list", urb); + warn("xhci_destroy_urb_priv: urb %p still on xhci->urb_list", urb); if (!list_empty(&urbp->complete_list)) warn("xhci_destroy_urb_priv: urb %p still on xhci->complete_list", urb); @@ -849,8 +853,6 @@ static int xhci_unlink_urb(struct urb *urb) list_del_init(&urb->urb_list); - xhci_delete_urb(urb); - /* Short circuit the virtual root hub */ if (urb->dev == xhci->rh.dev) { rh_unlink_urb(urb); @@ -861,17 +863,12 @@ static int xhci_unlink_urb(struct urb *urb) xhci_call_completion(urb); } else { if (urb->transfer_flags & USB_ASYNC_UNLINK) { + /* We currently don't currently attempt to cancel URBs + * that have been queued in the ring. We handle async + * unlinked URBs when they complete. */ urbp->status = urb->status = -ECONNABORTED; - - spin_lock(&xhci->urb_remove_list_lock); - - list_add(&urb->urb_list, &xhci->urb_remove_list); - - spin_unlock(&xhci->urb_remove_list_lock); - spin_unlock(&urb->lock); spin_unlock_irqrestore(&xhci->urb_list_lock, flags); - } else { urb->status = -ENOENT; @@ -887,6 +884,8 @@ static int xhci_unlink_urb(struct urb *urb) } else schedule_timeout(1+1*HZ/1000); + xhci_delete_urb(urb); + xhci_call_completion(urb); } } @@ -1419,9 +1418,6 @@ static int alloc_xhci(void) xhci->state = USBIF_STATE_CLOSED; - spin_lock_init(&xhci->urb_remove_list_lock); - INIT_LIST_HEAD(&xhci->urb_remove_list); - spin_lock_init(&xhci->urb_list_lock); INIT_LIST_HEAD(&xhci->urb_list); diff --git a/linux-2.6.10-xen-sparse/drivers/xen/usbfront/xhci.h b/linux-2.6.10-xen-sparse/drivers/xen/usbfront/xhci.h index 233cf41050..f503e59ebc 100644 --- a/linux-2.6.10-xen-sparse/drivers/xen/usbfront/xhci.h +++ b/linux-2.6.10-xen-sparse/drivers/xen/usbfront/xhci.h @@ -68,10 +68,6 @@ struct xhci { spinlock_t urb_list_lock; struct list_head urb_list; /* P: xhci->urb_list_lock */ - /* List of asynchronously unlinked URB's */ - spinlock_t urb_remove_list_lock; - struct list_head urb_remove_list; /* P: xhci->urb_remove_list_lock */ - /* List of URB's awaiting completion callback */ spinlock_t complete_list_lock; struct list_head complete_list; /* P: xhci->complete_list_lock */ -- 2.30.2